// 布尔值 true/false
// let isDone: boolean = true
// console.log(isDone)

// 数字
// let age: number = 18
// let age: number = 0xf00d
// console.log(age)

// 字符串
// let myName: string = 'bob'
// let age: number = 12
// console.log(`my name is ${myName}, I'am ${age} years old.`)

// 数组
// 声明方式一
// let list: number[] = [1, 2, 3]

// // 声明方式二：数组泛型
// let list2: Array<number> = [1, 2, 3]
// console.log(list)
// console.log(list2)

// 元祖 Tuple
// let x: [string, number] = ['hello', 100]
// console.log(x)
// x[3] = 'hello' // 报错
// console.log(x[3].toString()) // 报错

// 枚举
// enum Color { Red, Green, Blue }
// let c: Color = Color.Green
// console.log(c) // 1

// 手动赋值
// enum Color { Red = 1, Green, Blue }
// let c: Color = Color.Green
// console.log(c) // 2

// enum Color { Red = 1, Green = 3, Blue = 5 }
// let c: Color = Color.Green
// console.log(c) // 3

// 由枚举的值得到它的名字
// enum Color { Red = 1, Green, Blue }
// let c: string = Color[2]
// console.log(c) // Green

// Any
// let noSure: any = 4
// noSure = 'maybe'
// noSure = true
// console.log(noSure)
// noSure.ifItExists()
// noSure.toFixed()

// let prettySure: Object = 4
// prettySure.toFixed() // 报错

// let list: any[] = [1, '2', true]
// list[1] = 200
// console.log(list)

// Void
// function warnUser(): void {
//   console.log('没有返回值')
// }
// warnUser()

// 只能赋值 null 或 undefined
// let unusable: void = undefined


// null 和 undefined
// let u: undefined = undefined
// let n: null = null
// console.log(u, n)

// let age: number = undefined
// let names: string = null

// let age: number | null | undefined = 1
// age = null


// never
// let hh: never
// console.log(hh)

// 返回 never 的函数必须存在无法达到的终点
function error(message: string): never {
  throw new Error(message)
}

// Object
// declare function create(o: object | null) : void;

// create({ prop: 0 })
// create(null)

// create(4) // 报错

// let o: object = { one: '1', two: '2' }
// console.log(o)


// 类型断言
// let someValue: any = 'this is a string'
// let strLength: number = (<string>someValue).length
// console.log(strLength)

// let someValue: any = 'this is a string'
// let strLength: number = (someValue as string).length
// console.log(strLength)


interface Todo {
  [name: number]: boolean
  age: number
}
type New = keyof Todo
const obj: New = "age"
// console.log(keyof Todo)